﻿//******************************************************************
//  utils.h
//  Libreria de utilizades externas para MDDipolar.cpp
//	Grupo de Fisica de Fluidos y Biocoloides - Univers. de Granada
//  ©2011, Dr. Juan Carlos Fernandez Toledano
//******************************************************************

#ifndef UTILS_H
#define	UTILS_H
struct parametros {
//Numero de particulas
	int npart;
	//Fraccion en volumen
	double phi;
	//Alcance del potencial de esfera dura
	double rcut;
	//Paso de tiempo de la simulacion
	double Dt;
	//Intensidad del campo magnetico
	double u0;
	//Reinicio de la simulacion
	int rest;
	//Altura de la caja en radios
	double h0;
	//Numero de correladores
	int ncorr;
	//Tiempo de relajacion del primer correlador
	double trelaj1;
	///Lado de caja
	double lbox[3];
	///Volumen
	double vol;
	///polidispersidad
	double poly;
	double dr[3];
	double t;
	double gamma_old;
	double mason;
	double lambda;
	double timBrown;
} ;


void importConfig(parametros *param)
{
	char line[250];
	char namefile[500];
	char strName[25], strValue[20],strDescrp[200];
	void split(char *cadena, char *name, char *value, char *descrp);
	void setValues(char *name, char*value, parametros *param);

	//Nombre del fichero de configuracion
	strcpy (namefile,"config.ini");
	ifstream MiArchivo (namefile,ios::in);
	if(MiArchivo.fail())
	{
		//No se encontro archivo de inicio
		cout<<"No fue posible encontrar el archivo 'config.ini'"<<endl;
		exit(1);
	}
	if (MiArchivo.is_open())
	{
		while(!MiArchivo.eof())
		{
            stringstream ss;
            string s;

			MiArchivo.getline(line,250);
			ss<<line;
			ss>>s;
			if(int(line[0])!=0) {
                split( line,strName,strValue,strDescrp);
                setValues(strName, strValue, param);
			}
		}
		MiArchivo.close();
	}
}

void split(char *cadena, char *name, char *value, char *descrp)
{
	int ind1, ind2, index, len;
	char *pch;
	pch=strchr(cadena,':');
	ind1 =pch-cadena+1;
	pch=strchr(cadena,';');
	ind2 =pch-cadena+1;
	len=strlen(cadena);


	if(ind1>0&&ind2>0)
	{
		index=0;
		for(int i=0;i<ind1-1;i++)
		{
			if(cadena[i]!=' ')
			{
				name[index]=cadena[i];
			}
			index++;
		}
		name[index]=0;

		index=0;
		for(int i=ind1;i<ind2-1;i++)
		{
			if((cadena[i]!=' ') && (cadena[i]!=0x09))
			{
				value[index]=cadena[i];
				index++;
			}

		}
		value[index]=0;

		index=0;
		for(int i=ind2;i<len;i++)
		{
			descrp[index]=cadena[i];
			index++;
		}
		descrp[index]=0;
	}
}

void setValues(char *name, char*value, parametros *param)
{

	if (strcmp(name, "hbox")==0)
	{
		double hh = atof(value);
		param->h0=hh;
	}
	else if (strcmp(name, "npart")==0)
	{
		int np = atoi(value);
		param->npart=np;
	}
	else if (strcmp(name, "ncorr")==0)
	{
		int np = atoi(value);
		param->ncorr=np;
	}
	else if (strcmp(name, "phi")==0)
	{
		double ph = atof(value);
		param->phi=ph;
	}
	else if (strcmp(name, "gamma_old")==0)
	{
		double ph = atof(value);
		param->gamma_old=ph;
	}
	else if (strcmp(name, "timBrown")==0)
	{
		double ph = atof(value);
		param->timBrown=ph;
	}
	else if (strcmp(name, "mason")==0)
	{
		double ph = atof(value);
		param->mason=ph;
	}
	else if (strcmp(name, "lambda")==0)
	{
		double ph = atof(value);
		param->lambda=ph;
	}
	else if (strcmp(name, "poly")==0)
	{
		double ph = atof(value);
		param->poly=ph;
	}
	else if (strcmp(name, "trelaj1")==0)
	{
		double ph = atof(value);
		param->trelaj1=ph;
	}
	else if (strcmp(name, "rcut")==0)
	{
		double rc = atof(value);
		param->rcut=rc;
	}
	else if (strcmp(name, "Dt")==0)
	{
		double D = atof(value);
		param->Dt=D;
	}
	else if (strcmp(name, "u0")==0)
	{
		double uu0 = atof(value);
		param->u0=uu0;
	}
	else if (strcmp(name, "restart")==0)
	{
		int re =(atoi(value));
		param->rest=re;
	}
	else
	{
		cout<<"Parametro de configuracion no reconocido por el sistema: "<<name<<endl;
	}
}

void printConfig(parametros param)
{
	cout.precision(3);
	printf("Parametros de la simulacion\n");
	cout.setf(ios::fixed);
	cout.fill('+');
	cout << setw(80) << "";
	cout<<"Npart: "<<param.npart<<endl;
	cout<<"Fraccion en volumen: "<< param.phi<<endl;
	cout<<"Alcance del potencial: "<<param.rcut<<endl;
	cout<<"Paso de tiempo de las simulaciones: "<<param.Dt<<endl;
	cout<<"Reinicio de la simulacion: "<<param.rest<<endl;
	cout << setw(80) << "";
}

#endif	/* UTILS_H */